﻿using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Collections;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; 

namespace HF.BizWinner.Lib.Util
{
    public class RandomCode
    {
        //用于Session的名称，仅内部使用
        private const string RANDOM_CODE = "RANDOM_CODE";

        //颜色列表，用于验证码、噪线、噪点
        private Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
        
        //字体列表，用于验证码
        private string[] font = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
        
        //验证码的字符集，去掉了一些容易混淆的字符
        private char[] character = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };

        private string chkCode = string.Empty;
        private Random rnd;
        private Bitmap bmp;
        private Graphics g;

        public RandomCode()
        {
            rnd = new Random();
            //生成验证码字符串
            for (int i = 0; i < 4; i++)
            {
                chkCode += character[rnd.Next(character.Length)];
            }

            bmp = new Bitmap(100, 40);
            g = Graphics.FromImage(bmp);

            g.Clear(Color.White);
            //画噪线
            for (int i = 0; i < 10; i++)
            {
                int x1 = rnd.Next(100);
                int y1 = rnd.Next(40);
                int x2 = rnd.Next(100);
                int y2 = rnd.Next(40);
                Color clr = color[rnd.Next(color.Length)];
                g.DrawLine(new Pen(clr), x1, y1, x2, y2);
            }
            //画验证码字符串
            for (int i = 0; i < chkCode.Length; i++)
            {
                string fnt = font[rnd.Next(font.Length)];
                Font ft = new Font(fnt, 18);
                Color clr = color[rnd.Next(color.Length)];
                g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 + 8, (float)8);
            }
            //画噪点
            for (int i = 0; i < 100; i++)
            {
                int x = rnd.Next(bmp.Width);
                int y = rnd.Next(bmp.Height);
                Color clr = color[rnd.Next(color.Length)];
                bmp.SetPixel(x, y, clr);
            }
        }

        /// <summary>
        /// 随机码图像
        /// </summary>
        public Bitmap Image
        {
            get { return this.bmp; }
        }

        /// <summary>
        /// 随机码
        /// </summary>
        public string Code
        {
            get { return this.chkCode; }
        }

        /// <summary>
        /// 将随机码加入Session
        /// </summary>
        public void AddToSession()
        {
            HttpSessionState Session = HttpContext.Current.Session;
            if (Session["RANDOM_CODE"] == null)
            {
                Session.Add("RANDOM_CODE", Code);
            }
            else
            {
                Session["RANDOM_CODE"] = Code;
            }
        }

        /// <summary>
        /// 从Session取得随机码
        /// </summary>
        /// <returns>随机码文本</returns>
        public string GetFormSession()
        {
            HttpSessionState Session = HttpContext.Current.Session;
            if(Session["RANDOM_CODE"] == null) return string.Empty;
            return Session["RANDOM_CODE"].ToString();
        }
    }
}
